﻿using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Globalization;
using System.Windows.Forms;

namespace Kyoh.Lib.WinForms
{
    /// <summary><c>PropertyGrid</c> コントロールにおける、ファイル名編集用のエディタを実装します。</summary>
    public class FileNameEditor : UITypeEditor
    {
        /// <summary><c>PropertyGrid</c> コントロールにおいて、編集画面を表示します。</summary>
        /// <param name="context">編集対象のオブジェクトを表す <see cref="ITypeDescriptorContext"/> オブジェクトを指定します。</param>
        /// <param name="provider">カスタム サポートを提供するオブジェクトを取得するための <see cref="IServiceProvider"/> オブジェクトを指定します。</param>
        /// <param name="value">編集対象のオブジェクトを指定します。</param>
        /// <returns>編集した結果のオブジェクトを返します。</returns>
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            string filter = null;
            foreach (var attr in context.PropertyDescriptor.Attributes)
            {
                var filterAttribute = attr as FileNameFilterAttribute;
                if (filterAttribute != null)
                {
                    if (filterAttribute.Culture.Equals(CultureInfo.CurrentUICulture))
                    {
                        filter = filterAttribute.FileNameFilter;
                        break;
                    }
                    else if (filterAttribute.Culture.Equals(CultureInfo.InvariantCulture))
                        filter = filter ?? filterAttribute.FileNameFilter;
                }
            }
            
            filter = filter ?? Properties.Resources.DefaultFileNameFilter;

            using (var dialog = new OpenFileDialog())
            {
                dialog.Filter = filter;
                dialog.FileName = value == null ? string.Empty : value.ToString();
                if (dialog.ShowDialog() == DialogResult.OK)
                    return dialog.FileName;
                else
                    return value;
            }
        }
        /// <summary>エディタの表示スタイルを取得します。</summary>
        /// <param name="context">編集対象のオブジェクトを表す <see cref="ITypeDescriptorContext"/> オブジェクトを指定します。</param>
        /// <returns>エディタの表示スタイルをあらわす <see cref="UITypeEditorEditStyle"/> 値として、<see cref="UITypeEditorEditStyle.Modal"/>。</returns>
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }
    }
}
